const Jszip = require('jszip')
// cnpm i jszip -D
class ArchivePlugin {
  constructor(options){
    this.options =options
  }
  // 利用compiler的emit生命周期钩子，输出asset到output目录之前执行
  apply(comipler){
    comipler.hooks.emit.tapAsync('ArchivePlugin', (compilation, callback) => {
      // compilation 对象，可以拿到此次编译的模块资源，编译生成的文件，变化的文件
      // asset对象key文件名，值文化的内容，它里面存放着所有将要输出到目录中的文件
      let assets = compilation.assets;
      let jszip = new Jszip()
      for(let filename in assets){
        const source = assets[filename].source;
        // jszip.file(文件名, 文件夹内容)
        jszip.file(filename, source)
      }
        jszip.generateAsync({type:"nodebuffer"}).then(content => {
          let filenmae = this.options.filename.replace('[timestamp]', Date.now() + '')
          assets[filenmae] = {
            source(){
              return content
            }
          }
          callback()
        })
    })
  }
}
module.exports = ArchivePlugin